/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.model.service;

import com.context.conexion.EnahoConexion;
import com.model.domain.persona.Personal;
import com.model.domain.usuario.CondicionActualizarAdministradorCampo;
import com.model.domain.usuario.CondicionActualizarOperadorCampo;
import com.model.domain.usuario.Perfil;
import com.model.domain.usuario.PerfilEnum;
import com.model.domain.usuario.Usuario;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import util.usuario.seguridad.Condicion;
import util.usuario.seguridad.PermisosTablaImpl;

/**
 *
 * @author Rdelacruz
 */
public class UsuarioService 
extends AbstractServiceOrm<Usuario>
{

    private PerfilService perfilService;
    private OdeiService odeiService;
    
    

    //public Usuario findFromBDByIdentificador() {
   //     throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    //}
    
    public Usuario findUsuarioParaAccesoSistema(String usuario, String clave) throws Exception {
        Connection con = null;
        PreparedStatement ps = null;
        try {
            con = EnahoConexion.getConexion();
             
            ps = con.prepareStatement(
                    "select perfil, nombre, activo, dni, odei "
                            + "from Personal u where replace(usuario,' ','') = ? and u.clave = ?");
            usuario = usuario.trim();
            clave = clave.trim();
            ps.setString(1, usuario);
            ps.setString(2, clave);
            ResultSet rs = ps.executeQuery();
            if(rs.next()) {
                Usuario u = new Usuario();
                String codPerfil = rs.getString("perfil");
                Perfil pf = perfilService.findConOpcionesByCodigo(con, codPerfil);                                
                u.setPerfil(pf);
                
                Personal p = new Personal();
                p.setNombres(rs.getString("nombre"));
                u.setPersonal(p);
                
                u.setIdentificador(usuario);
                u.setClave(clave);
                u.setActivo(rs.getBoolean("activo"));
                
                p.setDni(rs.getString("dni"));
                
                p.setOdei(odeiService.findByCodigo(con, rs.getString("odei")));
                
                setearPermisosPersonal(u);                
                return u;
            }
        }
        finally {
            if(con!=null) con.close();
            if(ps!=null) ps.close();                        
        }
        return null;
    }
    
    private void setearPermisosPersonal(Usuario u) throws Exception {
        Personal p = u.getPersonal();
        PerfilEnum e = u.getPerfil().getEnum();
                
        PermisosTablaImpl permisosPersonal = new PermisosTablaImpl();
        switch(e) {
            case ADMINISTRADOR_SISTEMA:                        
                permisosPersonal.insertar();
                permisosPersonal.actualizar();
                permisosPersonal.eliminar();                        
                break;
            case ADMINISTRADOR_CAMPO:                
                //Condicion condInsertar = new CondicionInsertarAdministradorCampo(p);
                Condicion condActualizar = new CondicionActualizarAdministradorCampo(p);
                
                permisosPersonal.insertar()
                        .restringir("perfil",new String[]{"01"})
                        .restringir("dpto", p.getOdei().getDepartamento().getCodigo())
                        .restringir("odei", p.getOdei().getCodigo());
                
                permisosPersonal.actualizar(condActualizar).excepto(new String[]{"perfil","dpto","odei","usuario"});                        
                break;
            case OPERADOR_SISTEMA:                        
            case OPERADOR_CAMPO:
                condActualizar = new CondicionActualizarOperadorCampo(p);
                permisosPersonal.actualizar(condActualizar)
                        .excepto(new String[]{"cargo","dpto","odei","perfil",
                            "usuario","activo","movil","pbasico","pfinal","fechaalta","fechabaja"});
                break;
            case USUARIO_NO_IDENTIFICADO: //no tiene permisos
        }
        
        //boolean b = permisosPersonal.puedeActualizar("perfil");        
        u.setPermisosTabla(permisosPersonal);
    }
   

    public PerfilService getPerfilService() {
        return perfilService;
    }

    public void setPerfilService(PerfilService perfilService) {
        this.perfilService = perfilService;
    }

    public OdeiService getOdeiService() {
        return odeiService;
    }

    public void setOdeiService(OdeiService odeiService) {
        this.odeiService = odeiService;
    }    
    
}
